<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  

  
  <title>Kafka学习笔记 | 个人博客</title>
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  <meta name="description" content="categories: MQ​                                                                          Kafka学习笔记 ​        Kafka是最初由Linkedin公司开发，是一个分布式、分区的、多副本的、多生产者、多订阅者，基于zookeeper协调的分布式日志系统（也可以当做MQ系统），常见可以用于web&#x2F;">
<meta property="og:type" content="article">
<meta property="og:title" content="Kafka学习笔记">
<meta property="og:url" content="http://codercheng.cn/2021/02/10/Kafka%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/index.html">
<meta property="og:site_name" content="个人博客">
<meta property="og:description" content="categories: MQ​                                                                          Kafka学习笔记 ​        Kafka是最初由Linkedin公司开发，是一个分布式、分区的、多副本的、多生产者、多订阅者，基于zookeeper协调的分布式日志系统（也可以当做MQ系统），常见可以用于web&#x2F;">
<meta property="og:locale" content="zh_CN">
<meta property="article:published_time" content="2021-02-10T06:19:58.206Z">
<meta property="article:modified_time" content="2021-03-03T07:29:21.837Z">
<meta property="article:author" content="CoderCheng">
<meta name="twitter:card" content="summary">
  
    <link rel="alternate" href="/atom.xml" title="个人博客" type="application/atom+xml">
  
  
    <link rel="icon" href="/favicon.png">
  
  
    <link href="//fonts.lug.ustc.edu.cn/css?family=Source+Code+Pro" rel="stylesheet" type="text/css">
  
  
<link rel="stylesheet" href="/css/style.css">

<meta name="generator" content="Hexo 4.2.1"></head>

<body>
  <div id="container">
    <div id="wrap">
      <header id="header">
  <div id="banner"></div>
  <div id="header-outer" class="outer">
    <div id="header-title" class="inner">
      <h1 id="logo-wrap">
        <a href="/" id="logo">个人博客</a>
      </h1>
      
    </div>
    <div id="header-inner" class="inner">
      <nav id="main-nav">
        <a id="main-nav-toggle" class="nav-icon"></a>
        
          <a class="main-nav-link" href="/">Home</a>
        
          <a class="main-nav-link" href="/archives">Archives</a>
        
      </nav>
      <nav id="sub-nav">
        
          <a id="nav-rss-link" class="nav-icon" href="/atom.xml" title="RSS Feed"></a>
        
        <a id="nav-search-btn" class="nav-icon" title="搜索"></a>
      </nav>
      <div id="search-form-wrap">
        <form action="//google.com/search" method="get" accept-charset="UTF-8" class="search-form"><input type="search" name="q" class="search-form-input" placeholder="Search"><button type="submit" class="search-form-submit">&#xF002;</button><input type="hidden" name="sitesearch" value="http://codercheng.cn"></form>
      </div>
    </div>
  </div>
</header>
      <div class="outer">
        <section id="main"><article id="post-Kafka学习笔记" class="article article-type-post" itemscope itemprop="blogPost">
  <div class="article-meta">
    <a href="/2021/02/10/Kafka%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/" class="article-date">
  <time datetime="2021-02-10T06:19:58.206Z" itemprop="datePublished">2021-02-10</time>
</a>
    
  </div>
  <div class="article-inner">
    
    
      <header class="article-header">
        
  
    <h1 class="article-title" itemprop="name">
      Kafka学习笔记
    </h1>
  

      </header>
    
    <div class="article-entry" itemprop="articleBody">
      
        <hr>
<h2 id="categories-MQ"><a href="#categories-MQ" class="headerlink" title="categories: MQ"></a>categories: MQ</h2><p>​                                                                          Kafka学习笔记</p>
<p>​        Kafka是最初由Linkedin公司开发，是一个分布式、分区的、多副本的、多生产者、多订阅者，基于zookeeper协调的分布式日志系统（也可以当做MQ系统），常见可以用于web/nginx日志、访问日志，消息服务等等，Linkedin于2010年贡献给了Apache基金会并成为顶级开源项目。</p>
<p>主要应用场景是：日志收集系统和消息系统。</p>
<p>Kafka主要设计目标如下：</p>
<p>以时间复杂度为O(1)的方式提供消息持久化能力，即使对TB级以上数据也能保证常数时间的访问性能。</p>
<p>高吞吐率。即使在非常廉价的商用机器上也能做到单机支持每秒100K条消息的传输。支持Kafka Server间的消息分区，及分布式消费，同时保证每个partition内的消息顺序传输。</p>
<p>同时支持离线数据处理和实时数据处理。支持在线水平扩展</p>
<p>有两种主要的消息传递模式：<strong>点对点传递模式、发布</strong>-<strong>订阅模式</strong>。大部分的消息系统选用发布-订阅</p>
<p>模式。Kafka<strong>就是一种发布</strong>-<strong>订阅模式</strong>。</p>
<p>Kafka只有消息的拉取，没有推送，可以通过轮询实现消息的推送。</p>
<ol>
<li><p>Kafka在一个或多个可以跨越多个数据中心的服务器上作为集群运行。</p>
</li>
<li><p>Kafka集群中按照主题分类管理，一个主题可以有多个分区，一个分区可以有多个副本分区。</p>
</li>
<li><p>每个记录由一个键，一个值和一个时间戳组成</p>
</li>
</ol>
<p>Kafka<strong>优势</strong></p>
<ol>
<li>高吞吐量：单机每秒处理几十上百万的消息量。即使存储了许多TB的消息，它也保持稳定的性</li>
</ol>
<p>能。</p>
<ol start="2">
<li><p>高性能：单节点支持上千个客户端，并保证零停机和零数据丢失。</p>
</li>
<li><p>持久化数据存储：将消息持久化到磁盘。通过将数据持久化到硬盘以及replication防止数据丢失。</p>
<ul>
<li>1  零拷贝 </li>
<li>2  顺序读，顺序写</li>
<li>3 利用Linux的页缓存</li>
</ul>
</li>
<li><p>分布式系统，易于向外扩展。所有的Producer、Broker和Consumer都会有多个，均为分布</p>
</li>
</ol>
<p>式的。无需停机即可扩展机器。多个Producer、Consumer可能是不同的应用。</p>
<ol start="5">
<li><p>可靠性 - Kafka是分布式，分区，复制和容错的。</p>
</li>
<li><p>客户端状态维护：消息被处理的状态是在Consumer端维护，而不是由server端维护。当失</p>
</li>
</ol>
<p>败时能自动平衡。</p>
<ol start="7">
<li><p>支持online和offline的场景。</p>
</li>
<li><p>支持多种客户端语言。Kafka支持Java、.NET、PHP、Python等多种语言。</p>
</li>
</ol>
<p><strong>核心概念</strong></p>
<p><strong>Producer</strong></p>
<p>生产者创建消息。</p>
<p>该角色将消息发布到Kafka的topic中。broker接收到生产者发送的消息后，broker将该消息<strong>追</strong> </p>
<p><strong>加</strong>到当前用于追加数据的 segment 文件中。</p>
<p>一般情况下，一个消息会被发布到一个特定的主题上。</p>
<ol>
<li><p>默认情况下通过轮询把消息均衡地分布到主题的所有分区上。</p>
</li>
<li><p>在某些情况下，生产者会把消息直接写到指定的分区。这通常是通过消息键和分区器来实现</p>
</li>
</ol>
<p>的，分区器为键生成一个散列值，并将其映射到指定的分区上。这样可以保证包含同一个键的</p>
<p>消息会被写到同一个分区上。</p>
<ol start="3">
<li>生产者也可以使用自定义的分区器，根据不同的业务规则将消息映射到分区。</li>
</ol>
<p><strong>Consumer</strong></p>
<p>消费者读取消息。</p>
<ol>
<li><p>消费者订阅一个或多个主题，并按照消息生成的顺序读取它们。</p>
</li>
<li><p>消费者通过检查消息的<strong>偏移量</strong>来区分已经读取过的消息。偏移量是另一种元数据，它是一个<strong>不断递增的整数值</strong>，在创建消息时，Kafka 会把它添加到消息里。在给定的<strong>分区</strong>里，每个消息的偏移量都是<strong>唯一</strong>的。消费者把每个分区最后读取的消息偏移量保存在Zookeeper 或Kafka上，如果消费者关闭或重启，它的读取状态不会丢失。</p>
</li>
<li><p>消费者是<strong>消费组</strong>的一部分。群组保证每个分区只能被一个消费者使用。</p>
</li>
<li><p>如果一个消费者失效，消费组里的其他消费者可以接管失效消费者的工作，再平衡，分区重新分配。</p>
</li>
</ol>
<p><strong>Broker</strong></p>
<p>一个独立的Kafka 服务器被称为broker。</p>
<p>broker 为消费者提供服务，对读取分区的请求作出响应，返回已经提交到磁盘上的消息。</p>
<ol>
<li><p>如果某topic有N个partition，集群有N个broker，那么每个broker存储该topic的一个partition。 </p>
</li>
<li><p>如果某topic有N个partition，集群有(N+M)个broker，那么其中有N个broker存储该topic的一个partition，剩下的M个broker不存储该topic的partition数据。</p>
</li>
<li><p>如果某topic有N个partition，集群中broker数目少于N个，那么一个broker存储该topic的一个或多个partition。在实际生产环境中，尽量避免这种情况的发生，这种情况容易导致Kafka集群数据不均衡。broker 是集群的组成部分。每个集群都有一个broker 同时充当了集群控制器的角色（自动从集群的活跃成员中选举出来）。</p>
</li>
</ol>
<p>在集群中，一个分区从属于一个broker，该broker 被称为分区的首领。</p>

      
    </div>
    <footer class="article-footer">
      <a data-url="http://codercheng.cn/2021/02/10/Kafka%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/" data-id="cko3snvwp000bi8uo26tk6i9t" class="article-share-link">Share</a>
      
      
    </footer>
  </div>
  
    
<nav id="article-nav">
  
    <a href="/2021/02/25/%E5%8D%9A%E5%AE%A2%E8%BF%81%E7%A7%BB/" id="article-nav-newer" class="article-nav-link-wrap">
      <strong class="article-nav-caption">Newer</strong>
      <div class="article-nav-title">
        
          博客迁移
        
      </div>
    </a>
  
  
    <a href="/2021/01/26/RabbitMQ%20%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/" id="article-nav-older" class="article-nav-link-wrap">
      <strong class="article-nav-caption">Older</strong>
      <div class="article-nav-title">RabbitMQ 学习笔记</div>
    </a>
  
</nav>

  
</article>

</section>
        
          <aside id="sidebar">
  
    
  <div class="widget-wrap">
    <h3 class="widget-title">分类</h3>
    <div class="widget">
      <ul class="category-list"><li class="category-list-item"><a class="category-list-link" href="/categories/Java/">Java</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/MySql/">MySql</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/Netty/">Netty</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/SpringBoot/">SpringBoot</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/SpringCloud/">SpringCloud</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/SpringMVC/">SpringMVC</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/Tomcat/">Tomcat</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/Zookeeper/">Zookeeper</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E4%BD%9C%E4%B8%9A/">作业</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E5%88%86%E5%B8%83%E5%BC%8F%E8%B0%83%E5%BA%A6/">分布式调度</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E6%A1%86%E6%9E%B6/">框架</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E7%9F%A5%E8%AF%86/">知识</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/">设计模式</a></li></ul>
    </div>
  </div>


  
    

  
    
  
    
  <div class="widget-wrap">
    <h3 class="widget-title">归档</h3>
    <div class="widget">
      <ul class="archive-list"><li class="archive-list-item"><a class="archive-list-link" href="/archives/2024/08/">八月 2024</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2022/09/">九月 2022</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2022/08/">八月 2022</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2022/04/">四月 2022</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2022/02/">二月 2022</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2021/11/">十一月 2021</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2021/06/">六月 2021</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2021/05/">五月 2021</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2021/04/">四月 2021</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2021/03/">三月 2021</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2021/02/">二月 2021</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2021/01/">一月 2021</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2020/12/">十二月 2020</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2020/11/">十一月 2020</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2020/10/">十月 2020</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2020/09/">九月 2020</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2020/08/">八月 2020</a></li></ul>
    </div>
  </div>


  
    
  <div class="widget-wrap">
    <h3 class="widget-title">最新文章</h3>
    <div class="widget">
      <ul>
        
          <li>
            <a href="/2024/08/28/CentOS%E5%86%85%E5%AD%98cpu%E6%8E%92%E6%9F%A5/">CentOS内存cpu排查</a>
          </li>
        
          <li>
            <a href="/2022/09/22/Linux%20%E6%9F%A5%E7%9C%8B%E6%97%A5%E5%BF%97%E5%91%BD%E4%BB%A4/">Linux 查看日志命令</a>
          </li>
        
          <li>
            <a href="/2022/08/30/dubbo%20%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98/">dubbo 常见问题</a>
          </li>
        
          <li>
            <a href="/2022/04/26/1%20%E6%BA%90%E7%A0%81%E7%AC%94%E8%AE%B0/">1 源码笔记</a>
          </li>
        
          <li>
            <a href="/2022/02/24/jvisualVM%20%E4%BD%BF%E7%94%A8%E7%AC%94%E8%AE%B0/">jvisualVM 使用笔记</a>
          </li>
        
      </ul>
    </div>
  </div>

  
</aside>
        
      </div>
      <footer id="footer">
  
  <div class="outer">
    <div id="footer-info" class="inner">
      &copy; 2024 CoderCheng<br>
      Powered by <a href="http://hexo.io/" target="_blank">Hexo</a>
    </div>
  </div>
</footer>
    </div>
    <nav id="mobile-nav">
  
    <a href="/" class="mobile-nav-link">Home</a>
  
    <a href="/archives" class="mobile-nav-link">Archives</a>
  
</nav>
    

<script src="//code.jquery.com/jquery-2.0.3.min.js"></script>


  
<link rel="stylesheet" href="/fancybox/jquery.fancybox.css">

  
<script src="/fancybox/jquery.fancybox.pack.js"></script>




<script src="/js/script.js"></script>




  </div>
</body>
</html>